После установки сред Vivado и Vitis в Ubuntu, вы можете разрабатывать приложения с использованием Vitis в системе Ubuntu. Аналогично Windows, вам необходимо сначала создать платформенный проект, а затем создать соответствующий проект приложения.
Когда мы создавали проект Petalinux, мы уже импортировали XSA файл в Ubuntu. На этом этапе выберите этот XSA файл и выберите Linux в качестве системы: нажмите finish.
Создайте проект приложения. На этот раз мы создадим только один проект приложения и организуем различные тесты периферии в модули. Сначала создайте проект приложения:
Нажмите finish, и проект приложения создан.
Текущая конфигурация GPIO включает 2 MIO LED/2 EMIO LED, 2 MIO KEY/2 EMIO KEY и один зуммер.
В системе Linux GPIO можно удобно управлять через интерфейс sysfs. Ниже приведено, как использовать sysfs для управления GPIO на платформе Zynq-7020.
GPIO Zynq-7020 разделены на:
MIO (Multiplexed I/O): 54 вывода, напрямую подключенных к PS (Processing System)
EMIO (Extended MIO): GPIO, расширенные через PL (Programmable Logic)
Сначала вам нужно определить номер GPIO, которым вы хотите управлять в системе Linux. Номер gpiochips в /sys/class/gpio соответствует первому GPIO и номеру MIO0, который обычно равен 906.
xxxxxxxxxx# Просмотр имен устройств GPIOcd /sys/class/gpiols# результат ls: export gpiochip906 unexport# Это указывает, что имя устройства GPIO - gpiochip906, соответствующий начальному номеру 906# Есть 54 MIO, поэтому EMIO начинается с 906+54=960Формула расчета номера GPIO:
MIO GPIO: исходный номер MIO 0~53, соответствующий номеру Linux 906~959
EMIO GPIO: номер EMIO начинается с 54, соответствующий номеру Linux, начиная с 960
Например:
MIO11 соответствует номеру GPIO 917
EMIO GPIO0 соответствует номеру GPIO 960
Предполагая, что вы хотите управлять EMIO0, вам нужно сначала экспортировать этот GPIO.
xxxxxxxxxx# Экспорт GPIO54echo 960 > /sys/class/gpio/exportУстановите GPIO в режим вывода или ввода:
xxxxxxxxxx# Установить в режим выводаecho out > /sys/class/gpio/gpio960/direction# Или установить в режим вводаecho in > /sys/class/gpio/gpio960/direction# Запрос направления выводаcat /sys/class/gpio/gpio960/direction
Режим вывода (управление светодиодами и т.д.):
xxxxxxxxxx# Вывод высокого уровняecho 1 > /sys/class/gpio/gpio960/value# Вывод низкого уровняecho 0 > /sys/class/gpio/gpio960/value
Режим ввода (чтение кнопок и т.д.):
xxxxxxxxxx# Чтение значения GPIOcat /sys/class/gpio/gpio960/value
После использования вы можете отменить экспорт:
xxxxxxxxxxecho 960 > /sys/class/gpio/unexport
Щелкните правой кнопкой мыши "src"->"new"->"Folder", чтобы создать папки GPIO и TEST:
Щелкните правой кнопкой мыши "GPIO"->"new"->"File", чтобы создать соответствующие файлы .c/.h; щелкните правой кнопкой мыши "TEST"->"new"->"File", чтобы создать соответствующие файлы .c; щелкните правой кнопкой мыши "src"->"new"->"File", чтобы создать main.c/main.h.
После добавления соответствующего кода окончательная структура проекта выглядит следующим образом:
Откройте Vitis, нажмите на следующую иконку:
Выберите Linux Agent по умолчанию и дважды щелкните, чтобы настроить этот Agent:
Во всплывающем интерфейсе введите IP-адрес платы разработки в поле Host, оставьте порт по умолчанию, изменять не нужно:
После заполнения вы можете нажать Test Connection, чтобы проверить, успешно ли соединение или нет. Следующее содержание указывает на успешное соединение:
Нажмите ok для выхода.
Поскольку путь загрузки по умолчанию - это первый раздел SD-карты, а первый раздел по умолчанию используется для хранения образов ядра, BOOT.BIN и другой информации. Поэтому создайте новую папку app в /home/root и загрузите скомпилированный .elf файл в эту папку.
Вы можете напрямую нажать на иконку в верхнем левом углу, чтобы скомпилировать код, или нажать "build project", как раньше, для компиляции:
Если возникает такая ошибка
Соответствующее решение - добавить путь к файлу заголовка в путь поиска.
Щелкните правой кнопкой мыши на проекте, выберите "C/C++ Build Settings":
После "Add":
После добавления страница:
Теперь компиляция может быть успешной.
Во время отладки Vitis загрузит код в директорию /home/root/app платы разработки для запуска. В этот момент вы можете использовать Vitis для пошаговой отладки или отладки с точками останова.
// export GPIOvoid export_gpio(int pin) { char buffer[4]; int fd = open("/sys/class/gpio/export", O_WRONLY); if (fd < 0) { perror("Failed to open export"); exit(1); } snprintf(buffer, sizeof(buffer), "%d", pin); write(fd, buffer, strlen(buffer)); close(fd); usleep(100000); // wait sysfs node build}
// set GPIO directionvoid set_direction(int pin, const char* direction) { char path[64]; snprintf(path, sizeof(path), "/sys/class/gpio/gpio%d/direction", pin); int fd = open(path, O_WRONLY); if (fd < 0) { perror("Failed to open direction"); exit(1); } write(fd, direction, strlen(direction)); close(fd);}
// write GPIOvoid write_gpio(int pin, int value) { char path[64]; char val = value ? '1' : '0'; snprintf(path, sizeof(path), "/sys/class/gpio/gpio%d/value", pin); int fd = open(path, O_WRONLY); if (fd < 0) { perror("Failed to open value for writing"); exit(1); } write(fd, &val, 1); close(fd);}
// read GPIOint read_gpio(int pin) { char path[64]; char val; snprintf(path, sizeof(path), "/sys/class/gpio/gpio%d/value", pin); int fd = open(path, O_RDONLY); if (fd < 0) { perror("Failed to open value for reading"); exit(1); } read(fd, &val, 1); close(fd); return (val == '1') ? 1 : 0;}